<?php
/*
 * * * * * * * * * * LICENCIA * * * * * * * * * * * * * * * * * * * * *

Copyright(C) 2012
Instituto Universtiario de Tecnología Dr. Federico Rivero Palacio

Este programa es Software Libre y usted puede redistribuirlo y/o modificarlo
bajo los términos de la versión 3.0 de la Licencia Pública General (GPLv3)
publicada por la Free Software Foundation (FSF), es distribuido sin ninguna
garantía. Usted debe haber recibido una copia de la GPLv3 junto con este
programa, sino, puede encontrarlo en la página web de la FSF, 
específicamente en la dirección http://www.gnu.org/licenses/gpl-3.0.html

 * * * * * * * * * * ARCHIVO * * * * * * * * * * * * * * * * * * * * *

Nombre: estudianteServicio.clase.php
Diseñador: Yuri Lazo (cloustery@gmail.com)
Programador: Yuri Lazo
Fecha: Diciembre de 2012
Descripción: 

	Esta clase ofrece el servicio de conexión a la base de datos, recibe 
	los parámetros, construye las consultas SQL, hace las peticiones a 
	la base de datos y retorna los objetos o datos correspondientes a la
	acción.

 * * * * * * * * Cambios/Mejoras/Correcciones/Revisiones * * * * * * * *
Diseñador - Programador /   Fecha   / Descripción del cambio
---                         ----      ---------

 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*/

class EstudianteServicio {
	
	//función que permite obtener los campos necesarios por defecto en el sql 
	// para las consultas comunes 
	public static function obtenerCamposSql(){
		$campos = 	"ts_persona.codigo,
					ts_persona.cedula,
					ts_persona.rif,
					ts_persona.cod_instituto,
					ts_persona.cod_pensum,
					ts_persona.nombre1,
					ts_persona.nombre2,
					ts_persona.apellido1,
					ts_persona.apellido2,
					ts_persona.sexo,
					ts_persona.fec_nacimiento,
					ts_persona.tip_sangre,
					ts_persona.telefono1,
					ts_persona.telefono2,
					ts_persona.cor_personal,
					ts_persona.direccion,
					ts_estudiante.num_carnet,
					ts_estudiante.num_expediente,
					ts_estudiante.cod_rusnies,
					ts_estudiante.login,
					ts_estudiante.estado";
		return $campos;
		}
		
	//función que permite recibir un objeto estudiante o un arreglo estudiante
	//con los campos necesarios por defecto en el sql para las consultas comunes 
	public static function obtenerObjetoEstudiante($estudiante,$i){
		
		$d = new Estudiante();
		
		$d->asignarCodigo(   			$estudiante[$i]['codigo'] 		);
		$d->asignarCedula(   			$estudiante[$i]['cedula'] 			);
		$d->asignarNumCarnet(   		$estudiante[$i]['num_carnet'] 		);
		$d->asignarNumExpediente(   	$estudiante[$i]['num_expediente'] 	);
		$d->asignarCodRusnies(   		$estudiante[$i]['cod_rusnies'] 		);
		$d->asignarEstado(   			$estudiante[$i]['estado'] 			);
		$d->asignarNombre1(				$estudiante[$i]['nombre1']			);
		$d->asignarNombre2(				$estudiante[$i]['nombre2']			);
		$d->asignarApellido1(       	$estudiante[$i]['apellido1']			);
		$d->asignarApellido2( 			$estudiante[$i]['apellido2']			);
		$d->asignarSexo(				$estudiante[$i]['sexo']				);
		$d->asignarRif(					$estudiante[$i]['rif']				);
		$d->asignarFecNacimiento( 		$estudiante[$i]['fec_nacimiento']	);
		$d->asignarTipSangre(   		$estudiante[$i]['tip_sangre']		);
		$d->asignarTelefono1(			$estudiante[$i]['telefono1']			);
		$d->asignarTelefono2(			$estudiante[$i]['telefono2']			);
		$d->asignarCorreoPersonal(		$estudiante[$i]['cor_personal']		);
		$d->asignarDireccion(			$estudiante[$i]['direccion']			);
		$d->asignarCodPensum(			$estudiante[$i]['cod_pensum']		);
		$d->asignarcodInstituto(		$estudiante[$i]['cod_instituto']		);
		$d->asignarLogin(				$estudiante[$i]['login']				);
		
		return $d;
	}
	
	//Función que permite obtener los estudiantes por medio de una búsqueda 
	//tomando en cuenta las coincidencias el alguna parte de el nombre, la Cédula o el apellido
	public static function obtenerEstudiantes($campos="*", $where=null, $orderBy=null, $parametros=null){
		//instrucción para reconocer el objeto conexión
		global $gbConectorBD1;
		
		//construcción de la consulta SQL
		$sql = "select $campos from public.ts_persona,
									public.ts_estudiante" 
			. (($where!=null)? " where $where":"")
			. (($orderBy!=null)? " order by $orderBy":"")
			. ";";
		
		
		$gbConectorBD1->conectar();  //conectarse a la base de datos
		//ejecutar el select, con los parámetros correspondientes	
		$result = $gbConectorBD1->ejecutarDQLDirecto($sql,$parametros);
		$gbConectorBD1->desconectar(); // desconectarse de la base de datos
		
		if (($result === FALSE) or ( $result === 0) ){
			//retorna false si ocurre un error, y 0 si la consulta no devuelve filas
			return $result;
		}else{
			for ($i = 0 ; $i < count($result); $i++){
				//retorna un arreglo de Instituto en caso de existir data
				$estudiante[$i] = new Estudiante();
				$estudiante[$i] = EstudianteServicio::obtenerObjetoEstudiante($result,$i);
			}
			return $estudiante;
		}
	}
		
	public static function obtenerListaEstudiantes($patron){
		$patron = "%" . $patron . "%";
		$where = " (ts_estudiante.codigo = ts_persona.codigo) AND 
  					(upper(ts_persona.nombre1) like upper($1) OR
  					upper(ts_persona.nombre2) like upper($1) OR   
  					upper(ts_persona.apellido1) like upper($1) OR
					upper(ts_persona.apellido2) like upper($1) OR
					cast(ts_persona.cedula as varchar(10)) like $1)";
		
		$campos = 	EstudianteServicio::obtenerCamposSql();

		return EstudianteServicio::obtenerEstudiantes($campos, $where, "apellido1 asc",array($patron));
		}
	
	public static function obtenerEstudiantePorCedula($cedula) {
		//construir sql
		$campos = 	EstudianteServicio::obtenerCamposSql();
		$where = "ts_estudiante.codigo = ts_persona.codigo AND cast(ts_persona.cedula as varchar(10)) = $1";
		return EstudianteServicio::obtenerEstudiantes($campos, $where, null, array($cedula));
	}
	
	
	static function modificarEstudiante($estudiante){
		global $gbConectorBD1;

		$sql = "update ts_estudiante set num_carnet=$1,num_expediente=$2,
		cod_rusnies=$3,login=$4,estado=$5 where codigo=$6;";

		
		$parametros = array($estudiante->obtenerNumCarnet(),			//1
							 $estudiante->obtenerNumExpediente(),		//2
							 $estudiante->obtenerCodRusnies(),			//3
							 $estudiante->obtenerLogin(),				//4
							 $estudiante->obtenerEstado(),				//5
							 $estudiante->obtenerCodigo()				//6
						);
						
		$gbConectorBD1->conectar();
		
		$result = $gbConectorBD1->ejecutarDQLDirecto($sql,$parametros);
		

		$gbConectorBD1->desconectar();
		
		
		if ((($result === FALSE) or ( $result === 0))){
			return false; 
		}else 
			return true;
	}

	static function agregarEstudiante($estudiante){
		global $gbConectorBD1;
		/*consulta sql: para colocarle el código busca el mayor en la base de datos
		     y le suma uno, si no lo encuentra le coloca el valor 11
		*/
		
		
		$sql = "insert into ts_estudiante values ((select max(codigo) from ts_persona),$1, $2, $3, $4,md5(reverse(cast($4 as varchar))), $5);";	
		$parametros = array($estudiante->obtenerNumCarnet(),			//1
							 $estudiante->obtenerNumExpediente(),		//2
							 $estudiante->obtenerCodRusnies(),			//3
							 $estudiante->obtenerLogin(),				//4
							 $estudiante->obtenerEstado()				//5
						);

		//conexión, ejecución y desconexión de la base de datos				
		$gbConectorBD1->conectar();
		
		$result = $gbConectorBD1->ejecutarDQLDirecto($sql,$parametros);
		
		$gbConectorBD1->desconectar();
		
		//echo "pg_affected_rows: $result <br><br>";
		if (($result === FALSE) or ( $result === 0) )
			return false;
		else 
			return true;
	}
	
	static public function eliminarEstudiante($codigo){
		global $gbConectorBD1;
		
		$sql = "delete from ts_estudiante 
		         where  cast(codigo as varchar(10)) = $1;";
		
		$parametros = array($codigo);
		
		//conexión, ejecución y desconexión
		$gbConectorBD1->conectar();
		
		$result = $gbConectorBD1->ejecutarDQLDirecto($sql,$parametros);
		
		$gbConectorBD1->desconectar();

		if (($result === FALSE) or ( $result === 0))
			return false; 
		else 
			return true;
	}
	
	static public function obtenerEstudiantePorCodigo($codigo) {

		global $gbConectorBD1;

		//construir sql
		$campos = 	EstudianteServicio::obtenerCamposSql();
		//$where = "(ts_estudiante.codigo = ts_persona.codigo) and ts_persona.codigo = $1";
		//return EstudianteServicio::obtenerEstudiantes($campos, $where, null, array($codigo));
		$sql = "SELECT $campos
				FROM 
					public.ts_persona, 
					public.ts_estudiante
				WHERE 
					ts_estudiante.codigo = ts_persona.codigo AND
					ts_persona.codigo = $1";

		//1. conexión a base de datos...
		
		$parametros = array($codigo);

		$sql2 = "select max(codigo) FROM  ts_persona;";


		$gbConectorBD1->conectar();
		$result = $gbConectorBD1->ejecutarDQLDirecto($sql, $parametros);
		$gbConectorBD1->desconectar();
		//$result2=cast($result2)+1;
		//3. procesar resultado
		if (($result === false) or ($result === 0))
			return $result;
		else{
			$d = EstudianteServicio::obtenerObjetoEstudiante($result,0);
			return $d;
		}
	}
	
	
	
	//obtiene un estudiante según el carnet asignado en la busqueda
	static public function obtenerEstudiantePorNumCarnet($NoCarnet){
		$campos = 	EstudianteServicio::obtenerCamposSql();
		$where = "ts_estudiante.codigo = ts_persona.codigo AND ts_estudiante.num_carnet = $1";
		return EstudianteServicio::obtenerEstudiantes($campos, $where, null, array($NoCarnet));
	}
	
	//obtiene un estudiante según el expediente asignado en la busqueda
	static public function obtenerEstudiantePorNumExpediente($numExpediente){
		$campos = 	EstudianteServicio::obtenerCamposSql();
		$where = "ts_estudiante.codigo = ts_persona.codigo AND ts_estudiante.num_expediente = $1";
		return EstudianteServicio::obtenerEstudiantes($campos, $where, null, array($numExpediente));
	}

	//obtiene un estudiante según el login asignado en la busqueda
	static public function obtenerEstudiantePorLogin($login){
		$campos = 	EstudianteServicio::obtenerCamposSql();
		$where = "ts_estudiante.codigo = ts_persona.codigo AND ts_estudiante.login = $1";
		return EstudianteServicio::obtenerEstudiantes($campos, $where, null, array($login));
	}
	
	//obtiene un estudiante según el CodRusnies asignado en la busqueda
	static public function obtenerEstudiantePorCodRusnies($codRusnies){
		$campos = 	EstudianteServicio::obtenerCamposSql();
		$where = "ts_estudiante.codigo = ts_persona.codigo AND ts_estudiante.cod_rusnies = $1";
		return EstudianteServicio::obtenerEstudiantes($campos, $where, null, array($codRusnies));
	}

	//obtiene un estudiante según el CodRusnies asignado en la busqueda
	static public function obtenerPersonaPorRif($Rif){
		$campos = 	EstudianteServicio::obtenerCamposSql();
		$where = "ts_estudiante.codigo = ts_persona.codigo AND ts_persona.rif = $1";
		return EstudianteServicio::obtenerEstudiantes($campos, $where, null, array($Rif));
	}
}
?>
